"""
 encoding    : utf-8
 @File       : ${NAME}.py
 @Author     : jyy
 @Version    :
 @Description: 城市列表模块页面方法类，
    tian_jia ：需要以字符串类型传入driver（浏览器实例），name（添加的名称）
    bian_ji  ：传入浏览器实例，要修改的城市,不指定要修改的城市名称就修改第一行，不指定修改名就在末尾加默认
    shan_chu ：传入浏览器实例，要删除的城市,不指定要删除的城市名称就删除第一行
 @Date       : ${YEAR}/${MONTH}/${DAY}
"""

from selenium import webdriver
from selenium.webdriver.common.by import By
from cloud_test.auto_code.pages.system_mangage import den_lu
import pytest
from selenium.webdriver.common.keys import Keys
import time
import copy


def get_yuan_su(driver):                                            # 获取页面列表信息
    driver.implicitly_wait(5)                                       # 静态等待最多5秒
    try :
        web_yuan_su = driver.find_element(By.XPATH,
            '/html/body/div/section/section/main/div/div[2]/div/div/div/div/div/div/div/table/tbody')  # 获取页面列表中的全部城市信息
        list_a = web_yuan_su.text.split('\n')                       # 获取城市名称和编号,储存为列表

    except:
        raise pytest.fail(reason='城市列表-获取元素失败，Xpath定位不到tbody下面的tr元素')
    return list_a
def da_kai_lie_biao(driver):                                        # 进入城市列表页面
    try :
        driver.implicitly_wait(5)                                   # 静态等待最多5秒
        ele = driver.find_element(By.XPATH, '/html/body/div/section/aside/div/ul/li[4]/div/span')    # 定位系统管理菜单栏
        ele.click()                                                 # 点击系统管理菜单栏
        ele = driver.find_element(By.XPATH, '/html/body/div/section/aside/div/ul/li[4]/ul/li[1]/a')  # 定位城市列表菜单栏
        ele.click()                                                 # 点击城市列表理菜单栏
    except :
        raise pytest.fail(reason='打开城市列表失败')


class chen_shi():
    def tian_jia(self,driver,name):                                 # 传入浏览器实例，要添加的城市名称
        self.driver = driver                                        # 获取浏览器实例
        self.driver.implicitly_wait(5)                              # 静态等待最多5秒
        da_kai_lie_biao(self.driver)                                # 打开城市列表

        time.sleep(0.5)
        list_a = copy.deepcopy(get_yuan_su(driver))                                # 获取添加前的列表信息

        ele = driver.find_element(By.XPATH,'/html/body/div/section/section/main/div/div[1]/button[1]')  # 定位添加按钮
        ele.click()                                                 # 点击添加按钮

        ele = driver.find_element(By.XPATH,'//*[@id="city"]')       # 定位输入框
        ele.click()                                                 # 点击输入框
        ele.send_keys(name)                                         # 输入添加的城市名称

        ele = driver.find_element(By.XPATH,'/html/body/div[2]/div/div[2]/div/div[2]/div[3]/button')    # 定位弹窗的添加按钮
        ele.click()                                                 # 点击弹窗的添加按钮
        try :
            ele = driver.find_element(By.XPATH,'/html/body/div[2]/div/div[2]/div/div[2]/div[3]/button')    # 定位弹窗的添加按钮
            raise pytest.fail(reason=f'已经添加过该城市')
        except :
            list_b = get_yuan_su(driver)                            # 获取添加后的列表信息
            if list_a == list_b :                                   # 对比两次的读取结果
                raise pytest.fail(reason=f'城市列表-添加失败\n添加前读取的城市列表信息:{list_a}\n添加后读取的城市列表信息:{list_b}')
            else :
                list_b.reverse()
                b = list_b[0].split(' ')                            # 获取list_b的第一个元素。将编号和城市名称按空格拆分加入列表b
                if name == b[1] :                                   # 对比添加的名称与读取到的列表中的新名称是否相等
                    assert 1==1 ,'城市名称添加成功'
                else :
                    raise pytest.fail(reason=f'城市列表-添加失败，新名称与添加的名称不同\n添加前读取的城市列表信息:{list_a}\n添加后读取的城市列表信息:{list_b}')

    def bian_ji(self,driver,name=' ',nwe='默认'):                    # 传入浏览器实例，要修改的城市,不指定要修改的城市名称就修改第一行，不指定修改名就在末尾加默认
        self.driver = driver                                        # 获取浏览器实例
        self.driver.implicitly_wait(5)                              # 静态等待最多5秒
        da_kai_lie_biao(self.driver)                                # 打开城市列表

        time.sleep(0.5)
        list_a = copy.deepcopy(get_yuan_su(driver))                 # 获取编辑前的列表信息

        int_a = 1                                                   # 变化选择的是第几个勾选框，从1开始
        int_b = 0                                                   # 记录找到的信息在第几行，没改变就是没找到
        if name != ' ' :                                            # name不为空字符，按指定名称修改
            for i in list_a :
                if i.split(' ')[1] == name :
                    ele = driver.find_element(By.XPATH,
                    f'/html/body/div[1]/section/section/main/div/div[2]/div/div/div/div/div/div/div/table/tbody/tr[{int_a}]/td[1]/span/label/span/input')
                                                                    # 定位要修改的城市的勾选框
                    ele.click()                                     # 点击勾选框
                    int_b = int_a - 1
                    nwe = i.split(' ')[1] + nwe
                    break
                int_a += 1
            if int_b == 0 :
                raise pytest.fail(reason=f'城市列表-编辑失败，找不到：为{name}的城市名称\n编辑前读取的城市列表信息:{list_a}')
        if name == ' ':  # 没有指定修改的城市名，默认修改第一行
            ele = driver.find_element(By.XPATH,
                                      f'/html/body/div[1]/section/section/main/div/div[2]/div/div/div/div/div/div/div/table/tbody/tr[1]/td[1]/span/label/span/input')
            # 默认定位第一行的城市的勾选框
            ele.click()  # 点击勾选框
            nwe = list_a[0].split(' ')[1] + nwe
        ele = driver.find_element(By.XPATH,'/html/body/div[1]/section/section/main/div/div[1]/button[2]')   # 定位编辑按钮
        ele.click()                                                 # 点击编辑按钮

        ele = driver.find_element(By.XPATH, '//*[@id="city"]')      # 定位输入框
        ele.click()                                                 # 点击输入框
        ele.send_keys(Keys.CONTROL,'a')                             # 全选文本
        ele.send_keys(Keys.BACK_SPACE)                              # 删除原来的文本
        ele.send_keys(nwe)                                          # 输入要修改的城市名称

        ele = driver.find_element(By.XPATH, '/html/body/div[2]/div/div[2]/div/div[2]/div[3]/button')        # 定位弹窗的编辑按钮
        ele.click()                                                 # 点击弹窗的编辑按钮

        list_b = get_yuan_su(driver)                                # 获取编辑后的列表信息

        if name != ' ':                                             # 指定名称修改
            if list_b[int_b].split(' ')[1] == name :
                assert 1 == 1 , '城市名称编辑成功'
            else :
                raise pytest.fail(reason=f'城市名称编辑失败，指定的城市名：{name}修改为：{nwe}\n编辑前读取的城市列表信息:{list_a}\n编辑后读取的城市列表信息:{list_b}')
        elif name == ' ':                                           # 默认修改
            if nwe != '默认' :
                if list_b[0].split(' ')[1] == nwe :
                    assert 1 == 1, '城市名称编辑成功'
                else :
                    raise pytest.fail(reason=f'城市名称编辑失败，指定的城市名：{name}修改为：{nwe}\n编辑前读取的城市列表信息:{list_a}\n编辑后读取的城市列表信息:{list_b}')
            else :
                if list_b[0].split(' ')[1] == name :
                    assert 1 == 1 , '城市名称编辑成功'
                else :
                    raise pytest.fail(reason=f'城市名称编辑失败，指定的城市名：{name}修改为：{nwe}\n编辑前读取的城市列表信息:{list_a}\n编辑后读取的城市列表信息:{list_b}')
        print(f'指定的城市名：{name}修改为：{nwe}\n编辑前读取的城市列表信息:{list_a}\n编辑后读取的城市列表信息:{list_b}')

    def shan_chu(self,driver,name=' '):                             # 浏览器实例，指定要删除的城市名称，不指定默认删除第1行
        self.driver = driver                                        # 获取浏览器实例
        self.driver.implicitly_wait(5)                              # 静态等待最多5秒
        da_kai_lie_biao(self.driver)                                # 打开城市列表

        time.sleep(0.5)
        list_a = copy.deepcopy(get_yuan_su(driver))                 # 获取编辑前的列表信息
        if list_a == [''] :
            raise pytest.fail(reason=f'没有课删除的城市信息，获取到的页面信息为：{list_a}')

        int_a = 1
        int_b = 0
        if name == ' ' :
            ele = driver.find_element(By.XPATH,
                                      f'/html/body/div[1]/section/section/main/div/div[2]/div/div/div/div/div/div/div/table/tbody/tr[1]/td[1]/span/label/span/input')
                                                                    # 默认定位第一行的城市的勾选框
            ele.click()                                             # 点击勾选框
        if name != ' ' :
            for i in list_a :
                if i.split(' ')[1] == name :
                    ele = driver.find_element(By.XPATH,
                    f'/html/body/div[1]/section/section/main/div/div[2]/div/div/div/div/div/div/div/table/tbody/tr[{int_a}]/td[1]/span/label/span/input')
                                                                    # 定位要修改的城市的勾选框
                    ele.click()                                     # 点击勾选框
                    int_b = int_a - 1
                    break
                int_a += 1
            if int_b == 0 :
                raise pytest.fail(reasom=f'删除失败，没有找到名为：{name}的公司名' )
        ele = driver.find_element(By.XPATH,'/html/body/div[1]/section/section/main/div/div[1]/button[3]')   # 定位删除按钮
        ele.click()                                                 # 点击删除

        ele = driver.find_element(By.XPATH,'/html/body/div[3]/div/div[2]/div/div[2]/div/div/div[2]/button[2]')  # 定位删除的二次确认弹窗的确定按钮
        ele.click()                                                  # 点击确定

        list_b = get_yuan_su(driver)                                # 获取删除后的城市列表信息
        if name != ' ':                                             # 如果指定了删除的城市名
            try:
                if list_b[int_b].split(' ')[1] == name:             # 删除后的列表中，被删除的那一行的城市名称与指定删除的城市名称相同
                    raise pytest.xfail(reason=f'删除失败，删除的公司名称：{name}\n删除后的公司列表信息：{list_b}')
            except:
                assert 1 == 1, '删除成功'
        elif name == ' ':                                           # 如果未指定删除的城市名
            try:
                if list_a[int_b].split(' ')[1] == list_b[int_b].split(' ')[1]:  # 删除前的第1行的城市名与删除后的第1行的城市名相同
                    raise pytest.xfail(
                        reason=f'删除失败，删除的公司名称：{list_a[int_b].split(' ')[1]}\n删除后的公司列表信息：{list_b}')
            except:
                assert 1 == 1, '删除成功'



"""
/html/body/div[1]/section/section/main/div/div[2]/div/div/div/div/div/div/div/table/tbody/tr[1]/td[1]/span/label/span/input     第1行勾选框
/html/body/div[1]/section/section/main/div/div[2]/div/div/div/div/div/div/div/table/tbody/tr[2]/td[1]/span/label/span/input     第2行勾选框
/html/body/div[1]/section/section/main/div/div[2]/div/div/div/div/div/div/div/table/tbody/tr[3]/td[1]/span/label/span/input     第3行勾选框

/html/body/div/section/section/main/div/div[2]/div/div/div/div/div/div/div/table/tbody   列表
/html/body/div[1]/section/section/main/div/div[2]/div/div/div/div/div/div/div/table/tbody/tr[1]/td[1]   勾选框
/html/body/div[1]/section/section/main/div/div[2]/div/div/div/div/div/div/div/table/tbody/tr[1]/td[2]   城市编号
/html/body/div[1]/section/section/main/div/div[2]/div/div/div/div/div/div/div/table/tbody/tr[1]/td[3]   城市名称



调试用
driver = webdriver.Firefox()        # 创建火候浏览器实例
url = 'http://127.0.0.1:82/cloud/#/open/login'
a=den_lu.deng_lu()
a.da_kai_llq(driver,url)
a.deng_lu(driver,'admin','123456','8888')
b = chen_shi()
b.shan_chu(driver,'呜呜呜')
"""

